<meta charset="utf-8" />
<!-- <script>
    // 可迭代对象  
    // 满足条件1：必须实现一个特定的函数: [Symbol.iterator]
    // 满足条件2：这个函数需要返回一个迭代器(这个迭代器用于迭代当前的对象)

    // infos就可以叫做可迭代对象
    let infos = {
        friends: ["码路", "漫漫", "前端"],
        [Symbol.iterator]() {
            let index = 0;
            let infosIterator = {
                next() {
                    if (index < infos.friends.length) {
                        return { done: false, value: infos.friends[index++] }
                    } else {
                        return { done: true, value: undefined }
                    }
                }
            }
            return infosIterator;
        }
    };
    // 返回了迭代器
    // let iterator = infos[Symbol.iterator]();
    // console.log(iterator.next());
    // console.log(iterator.next());
    // console.log(iterator.next());
    // console.log(iterator.next());

    // 只要是一个可迭代对象，都可以使用for of进行遍历
    // infos is not iterable
    for (let item of infos) {
        console.log(item);
    }
</script> -->
















<!-- <script>
    // 可迭代对象
    let infos2 = {
        name: "码路",
        age: 18,
        height: 1.88,
        [Symbol.iterator]() {
            let entries = Object.entries(this);
            // console.log("entries:", entries);
            // iterator迭代器
            // iterable可迭代的
            let index = 0;
            let infos2Iterator = {
                next() {
                    if (index < entries.length) {
                        return { done: false, value: entries[index++] }
                    } else {
                        return { done: true, value: undefined }
                    }
                }
            }
            return infos2Iterator;
        }
    };
    // 可迭代对象必然具备下面的特点
    // const iterator = infos2[Symbol.iterator]()
    // console.log(iterator.next());
    // console.log(iterator.next());
    // console.log(iterator.next());
    // console.log(iterator.next());

    // 只要是可迭代对象，都可以使用for of
    for (let item of infos2) {
        console.log(item);
    }
</script> -->










<script>
    // JS中哪些容器天生就是可迭代对象
    // 1）数组
    // const names = ["aaa", "bbb", "ccc"]
    // for (const name of names) {
    //     console.log(name)
    // }
    // let iterator = names[Symbol.iterator](); // 得到迭代器
    // console.log(iterator.next());
    // console.log(iterator.next());
    // console.log(iterator.next());
    // console.log(iterator.next());

    // console.log("---------------");

    // 2）Set
    // new Set时 ()中只要写可迭代对象都可以
    // ["aaa", "bbb", "ccc"] 就是一个迭代对象
    // const set = new Set(["aaa", "bbb", "ccc"])
    // for (const item of set) {
    //     console.log(item)
    // }
    // const setIterator = set[Symbol.iterator]()
    // console.log(setIterator.next())
    // console.log(setIterator.next())
    // console.log(setIterator.next())
    // console.log(setIterator.next())

    // console.log("---------------");

    // 3）arguments
    // function foo() {
    //     for (const arg of arguments) {
    //         console.log(arg)
    //     }
    // }
    // foo(111, 222, 333, 444)

    // console.log("---------------");

    // 4）字符串
    // let str = "hello";
    // for (let item of str) {
    //     console.log(item);
    // }

    // console.log("---------------");

    // 对象不是可迭代对象
    // let obj = {
    //     name: "wc",
    //     age: 18,
    //     sex: "man"
    // }
    // // TypeError: obj is not iterable
    // // iterable 可迭代的
    // for (let item of obj) {
    //     console.log(item);
    // }

    let obj = {a:1,b:2,c:3}
    let res = {...obj}
    console.log(res);

    function fn(x,y,z){
        console.log(x,y,z);
    }
    fn(obj.a,obj.b,obj.c)
    // requires ...iterable[Symbol.iterator] to be a function
    fn(...obj)
</script>